/**
 * \file Population.h
 * \brief Définit la structure Population
 *
 */

#ifndef POPULATION_H
#define POPULATION_H

#include "Personnage.h"

/**
 * \brief Informations définissant la population
 * \details Cette structure gère le=es différents paramètres démographiques de la population
 *
 */

typedef struct
{
  Personnage *membres;   /*!<tableau des Personnages contenus dans la population. */
  Personnage *dernierPersonnage; /*<lien sur le dernier personnage de la liste */
  unsigned int effectifTotal;   /*!<effectif de la population. */
  int fecondite;   /*!<taux de fécondité de la population, exprimé en pourcentage. */
  int mortalite;   /*!<taux de mortalité de la population, exprimé en pourcentage. */
  int immigration;   /*!<nombre de nains arrivants par immigration. */
  int emigration;   /*!<nombres de nains emmigrants, cela est limité à 50% de l'effectif total. */
  int moral;   /*!<moral des nains exprimé en pourcentage de moral, 0 étant le moral le plus bas. */
  unsigned int nbPersonnagesAffames;   /*!<nombre de personnages arrivés à l'état de faim. */
  TabComp *tabComp;	/*!<Tableau des comportements possibles pour les membres de la population */
} Population;


/*===================Fonctions======================*/

/**
 *\brief Initialise les valeurs de la population
 *\details Initialise la liste des Personnages ainsi que les paramètres démographiques et le décompte des nains en état de faim
 *
 */
void initPopulation(Population* population);

/**
 *\brief Initialise la population
 *\details Initialise alloue dans la mémoire la population puis la liste des Personnages ainsi que les paramètres démographiques et le décompte des nains en état de faim
 *
 */
void creerPopulation(Population** population);

/**
 *\brief Ajoute un membre à lapopulation
 *\details Ajoute un membre à la liste de membres et initialise le personnage correspondant
 *
 */
void ajouterMembre(Population* population);

/**
 *\brief Retire un membre à la population
 *\details Retire une structure Personnages de la liste des membres contenus dans la population
 *
 */
void retirerMembre(Population* population, Personnage *personnage);

/**
 *\brief récupère le liens vers un personnage
 *\details récupère un pointeurs vers un personnage à partir de son id d'identification
 *
 */
Personnage* getPersonnage(Population* population, const unsigned int ID);

/**
 *\brief récupère la valeur de l'effectif de la population.
 *
 */
unsigned int getEffectifTotal(Population* population);

/**
 *\brief récupère le taux de fécondité de la population.
 *
 */
int getFecondite(Population* population);

/**
 *\brief récupère la valeur du taux de mortalité de la population.
 *
 */
int getMortalite(Population* population);


/**
 *\brief récupère le nombre d'immigrants arrivant dans la population.
 *
 */
int getImmigration(Population* population);


/**
 *\brief récupère le nombre d'emigrants de la population.
 *
 */
int getEmigration(Population* population);


/**
 *\brief récupère la valeur de moral de la population.
 *
 */
int getMoral(Population* population);

/**
 *\brief récupère le nombre de personnes affamées dans la population.
 *
 */
unsigned int getNbPersAffames(Population* population);

/**
 *\brief récupère le tableau des comportements possibles pour les membres de
 * la population
 *
 */
TabComp *getTabCompPop(Population* population);

/**
 *\brief ajoute la valeur passée en argument à l'effectif total
 *
 */
void setEffectifTotal(Population* population, const int varEffectif);

/**
 *\brief ajoute la valeur passée en argument au taux de fécondité
 *
 */
void setFecondite(Population* population, const int varFecondite);


/**
 *\brief ajoute la valeur passée en argument au taux de mortalité
 *
 */
void setMortalite(Population* population, const int varMortalite);

/**
 *\brief ajoute la valeur passée en argument au nombre d'immigrants
 *
 */
void setImmigration(Population* population, const int varImmigration);

/**
 *\brief ajoute la valeur passée en argument au nombre d'emigrants
 *
 */
void setEmigration(Population* population, const int varEmigration);

/**
 *\brief ajoute la valeur passée en argument au moral de la population
 *
 */
void setMoral(Population* population, const int varMoral);

/**
 *\brief ajoute la valeur passée en argument au nombre de personnes affamées
 *
 */
void setNbPersAffames(Population* population, unsigned int varNbPersAffames);

/**
 *\brief attribue au champ tabComp un tableau des comportements passé en
 * paramètre
 *
 */
void setTabCompPop(Population* population, TabComp *tabComp);

/**
 *\brief libère la mémoire occupée par le tableau de membres
 *
 */
void detruireMembres(Population* population);

/**
 *\brief libère la mémoire occupée par la population
 *
 */
void detruirePopulation(Population* population);

#endif

